package com.qianxun.framework.common.util;

/**
 * 字符串工具
 * @author: huwei
 * @date: 2019/9/11 17:43
 * @version: 1.3.0
 */
public class StringUtil {
    /**
     * 将给定对象的字符串表现形式依据传入顺序串联到一起
     * @param objects 串联对象，若对象不是String类型，则取对象的String.valueOf(obj)字符串
     * @return
     */
    public static String concat(Object ...objects){
        return concatMark(null ,objects);
    }
    /**
     * 将给定对象的字符串表现形式依据传入顺序串联到一起
     * @param joinMark 连接符
     * @param objects 串联对象，若对象不是String类型，则取对象的String.valueOf(obj)字符串
     * @return
     */
    public static String concatMark(String joinMark ,Object ...objects){
        AssertUtil.notEmpty(objects);

        String innerJoinMark = ObjectUtil.isBlank(joinMark) ? "" : joinMark;
        StringBuffer stringBuffer = new StringBuffer();
        for(int i = 0 ;i < objects.length ;++i){
            stringBuffer.append(objects[i]).append(innerJoinMark);
        }
        //删除最后一个连接符
        stringBuffer.delete(stringBuffer.length() - innerJoinMark.length() ,stringBuffer.length());

        return stringBuffer.toString();
    }
    /**
     * 将指定字符串指定下标的字符，转换为大写
     * @param str 源字符串
     * @param index 指定下标，该下标必须在str的长度范围内才有效；
     * @return
     */
    public static String toUpperCase(String str ,int index){
        return toUpperCase(str, index ,1);
    }
    /**
     * 将指定字符串指定下标的字符，转换为大写
     * @param str 源字符串
     * @param index 指定下标，该下标必须在str的长度范围内才有效；
     * @param length 转换个数，从指定下标开始，超出str长度，以str长度为准；
     * @return
     */
    public static String toUpperCase(String str ,int index , int length){
        if(ObjectUtil.isBlank(str) || index < 0 || index >= str.length()){
            return str;
        }
        int end = length + index > str.length() || length < 1 ? str.length() : length + index;
        String target = str.substring(index ,end).toUpperCase();
        return new StringBuffer(str).delete(index ,end).insert(index ,target).toString();
    }
    /**
     * 删除指定字符串指定的前缀
     * @param str 源字符串
     * @param prefix 前缀
     * @return
     */
    public static String removePrefix(String str ,String prefix) {
        if(ObjectUtil.isBlank(str) || ObjectUtil.isBlank(prefix)){
            return str;
        }
        StringBuffer stringBuffer = new StringBuffer(str);
        while(stringBuffer.indexOf(prefix) == 0){
            stringBuffer.delete(0 ,prefix.length());
        }
        return stringBuffer.toString();
    }
    /**
     * 删除指定的后缀
     * @param str 源字符串
     * @param suffix 后缀
     * @return
     */
    public static String removeSuffix(String str ,String suffix) {
        if(ObjectUtil.isBlank(str) || ObjectUtil.isBlank(suffix)){
            return str;
        }
        StringBuffer stringBuffer = new StringBuffer(str);
        while(stringBuffer.lastIndexOf(suffix) == stringBuffer.length() - suffix.length()){
            stringBuffer.delete(stringBuffer.length() - suffix.length() ,stringBuffer.length());
        }
        return stringBuffer.toString();
    }
    /**
     * 添加前缀
     * @param str 源字符串
     * @param prefix 前缀
     * @param allLength 添加后总体长度，添加后的字符总体长度总是小于等于allLength ，出现这样的原因是：prefix 与str不能取整；
     * @return
     */
    static public String addPrefix(String str ,String prefix ,int allLength) {
        StringBuffer stringBuffer = new StringBuffer();
        while(stringBuffer.length() + prefix.length() + str.length() <= allLength) {
            stringBuffer.append(prefix);
        }
       return stringBuffer.append(str).toString();
    }
    /**
     * 添加后缀
     * @param str 源字符串
     * @param suffix 后缀
     * @param allLength 添加后总体长度，添加后的字符总体长度总是小于等于allLength ，出现这样的原因是：suffix 与str不能取整；
     * @return
     */
    static public String addSuffix(String str ,String suffix ,int allLength) {
        StringBuffer stringBuffer = new StringBuffer(str);
        while(stringBuffer.length() + suffix.length() <= allLength) {
            stringBuffer.append(suffix);
        }
        return stringBuffer.toString();
    }
}
